#ifndef DTARTISTE_H
#define DTARTISTE_H

#include "../abstract/abstractdata.h"
#include "dtalbum.h"
#include "../database/dbartist.h"

#include <QString>
#include <QHash>
#include <QDebug>
#include <QLabel>

class DtGenre;
class DtTrack;

class DtArtist : public AbstractData
{
private:
    QList<DtTrack *> lTrack;
    QList<DtAlbum *> lAlbum;
    QList<DtGenre *> lGenre;
public:
    enum {
        Play = 0,
        Add = 1,
        Name = 2,
        Heart = 3,
        Id = 4,
        NbAttr
    };
    DtArtist();
    DtArtist(const QString & name, const int id = -1, const bool heart = false);
    DtArtist(const DtArtist &artist);
    virtual ~DtArtist();
    /**
     * @brief operator << is use for the debbugging with Qt. See the Qt Doc to
     *find more help on this function
     * @param dbg the stream of debugging
     * @param artist the artist to show
     * @return
     */
    friend QDebug operator<<(QDebug dbg, const DtArtist &artist);

    /*!
     * \brief Retourne le nombre d'attribut contenu dans la classe enfant
     * \return le nombre d'attribut
     */
    int getNbAttr() const;

    /*!
     * \brief Retourne l'attribut numero nb.
     * \param nb : le numero de l'attribut.
     * \return L'attribut correspondant à nb.
     */
    QVariant getAttr(const int nb);
    /*!
     * \brief Lorsque l'utilisateur clique sur une colonne une action est lancée
     *
     * Méthode de gestion d'action sur le tableau. Elle permet d'effectuer
     *l'action adéquate pour la case
     * \param section : Le numéro de la colonne
     */
    void clicked(const int section);

    /*!
     * \brief Retourne la tooltip sur l'artist
     * \return QVariant représentant la tooltip de l'artiste
     */
    QVariant getToolTip() const;

    static DtArtist * findById(QList<DtArtist *> &sArtist, const int id);

    void addTrack(DtTrack *track);
    void addAlbum(DtAlbum *album);
    void addGenre(DtGenre *genre);

    QList<DtAlbum *> &getAlbums();
    QList<DtGenre *> &getGenres();
    QList<DtTrack *> &getTracks();
};

/**
 * @brief operator == is use for the QSet container.
 * @param artist1
 * @param artist2
 * @return
 */
inline bool operator==(const DtArtist &artist1, const DtArtist &artist2)
{
    return (artist1.getName() == artist2.getName());
}

/**
 * @brief qHash is use for the QSet container too
 * @param artist
 * @return
 */
inline uint qHash(const DtArtist &artist)
{
    return qHash(artist.getName());
}

#endif // DTARTISTE_H
